#ifndef CONNECTIONPOLL_H
#define CONNECTIONPOLL_H

#include<string>
#include<queue>
#include<mutex>
#include<atomic>
#include<thread>
#include<memory>
#include<functional>
#include<condition_variable> //条件变量
using namespace std;

#include"db.h"

class ConnectionPool
{
public:
     //提供一个单例接口
    static ConnectionPool* getConnectionPool();

	//提供给 外部，从 链接池里获取一个可用的 链接
	shared_ptr<MySQL>  getConnection(); //shared_ptr 用户不用的时候，自动析构释放资源

private:    
    //构造函数私有化
    ConnectionPool();
	//delete掉 赋值构造 和  =运算符重载
    ConnectionPool(const ConnectionPool&)=delete;
    ConnectionPool& operator=(const ConnectionPool&)=delete;

	// 加载配置文件中的数据
	bool loadConfigFile();

	// 负责生产新连接的 线程方法
	void produceConnection();

	//负责扫描超过 超时空闲时间 的链接，并且回收
	void scannerConnectionTask();
private:
	string _ip;//mysql的ip地址
	unsigned int _port;//mysql的端口
	string _username;//mysql的登录用户名
	string _password;//mysql的登录密码
	string _dbname;//链接的数据库名称

	int _initSize;//初始的链接池链接量
	int _maxSize;//最大的链接池链接量
	int _maxIdleTime;//连接池最大空闲时间
	int _connectionTimeout;//连接池回去连接超时时间

	queue<MySQL*> _connectionQue;//储存mysql连接的队列
	mutex _queueMutex;//保证连接队列的线程安全
	atomic_int _connectionCnt; //记录链接所创建 connection链接的总数量

	condition_variable cv; //设置条件变量，用于  线程间的通信，消费者通知生产者 需要链接生产了
};



#endif